/**
 * 文件名：@MapUtil.java <br/>
 * 包名：cn.efunbox.afw.core.util <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.util;

import java.util.HashMap;
import java.util.Map;

import cn.efunbox.afw.core.exception.AfwRuntimeException;

/**
 * 类名：MapUtil  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月3日 下午6:27:34  <br />
 * @version 2015年12月3日
 */
public class MapUtil {

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015-7-23 下午02:49:23 <br/>
	 */
	public static final <V> Map<String, V> toMapExp(String expression, String entrySeparator) {
		return toMapExp(expression, entrySeparator, "=");
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015-7-23 下午02:48:10 <br/>
	 */
	public static final <V> Map<String, V> toMapExp(String expression) {
		return toMapExp(expression, "\\,");
	}
	
	/**
	 * 
	 * 功能：将表达式解析为map <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015-7-23 下午02:37:12 <br/>
	 */
	@SuppressWarnings("unchecked")
	public static final <V> Map<String, V> toMapExp(String expression, String entrySeparator, String kvSeparator) {
		if (null != expression) {
			Map<String, V> map = new HashMap<String, V>();
			
			int len = kvSeparator.length();
			
			// 去掉两端的{}
			if (expression.startsWith("{") && expression.endsWith("}")) {
				expression = expression.substring(1, expression.length() - 1);
			}
			
			// 处理
			for (String entry : expression.split(entrySeparator)) {
				int index = entry.indexOf(kvSeparator);
				
				String key = entry;
				String value = null;
				
				if (index != -1) {
					// 截取出key
					key = entry.substring(0, index);
					
					// 截取出value，这里可能会出现空串
					value = entry.substring(index + len);
				}
				
				map.put(key, (V) value);
			}
			
			return map;
		}
		
		return null;
	}

	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015-7-21 下午04:06:36 <br/>
	 */
	public static final Map<String, Object> toMapTwins(Object... args) {
		Map<String, Object> map = new HashMap<String, Object>();
		
		if (null == args || args.length % 2 != 0) {
			throw new AfwRuntimeException("toMap parameters is invild");
		}
		
		for (int i = 0, len = args.length; i < len; i += 2) {
			map.put((String) args[i], args[i + 1]);
		}

		return map;
	}
}
